package com.universest.swordholder.aitool

import okhttp3.sse.EventSource
import java.io.IOException

abstract class AbstractLlmApi {

    interface StreamCallback {
        fun onChunk(chunk: String)
        fun onDeepThought(reasoning: String)
        fun onComplete()
        fun onError(e: Exception)
    }

    /**
     * 限制一次请求中模型生成 completion 的最大 token 数。输入 token 和输出 token 的总长度受模型的上下文长度的限制。
     */
    var maxTokens: Int = 12800

    /**
     * 采样温度，介于 0 和 2 之间。更高的值，如 0.8，会使输出更随机，而更低的值，如 0.2，会使其更加集中和确定。
     * 我们通常建议可以更改这个值或者更改 top_p，但不建议同时对两者进行修改。
     */
    var temperature: Float = 1f

    /**
     * 模型生成时使用的 top_p。
     */
    var topP: Float = 1f

    /**
     * 介于 -2.0 和 2.0 之间的数字。如果该值为正，那么新 token 会根据其是否已在已有文本中出现受到相应的惩罚，
     * 从而增加模型谈论新主题的可能性。
     */
    var presencePenalty: Float = 0.0f

    /**
     * 介于 -2.0 和 2.0 之间的数字。如果该值为正，那么新 token 会根据其在已有文本中的出现频率受到相应的惩罚，
     * 降低模型重复相同内容的可能性。
     */
    var frequencyPenalty: Float = 0.0f

    var responseFormat: String = "{\"type\":\"text\"}"

    var stops: List<String>? = null

    @Throws(IOException::class)
    abstract fun chat(messages: List<Message>): Message?

    abstract fun chatStream(messages: List<Message>, callback: StreamCallback): EventSource

    abstract fun getModel(): String

}
